上一篇提到Image交付方式(打包成.tar
檔),如果是要在私有網路內建立自己的Image管理庫,建立一個Private Registry,這種方法適合多個Image的管理和分發,今天來利用Docker建一個簡易的Registry來玩玩看。
使用Docker官方提供的Image:Registry
來實作
# 尋找 Registry Image
docker search registry
# 運行本地 Registry 容器
docker run -d -p 5000:5000 --name registry registry:2
# 標記Image
docker tag <image_name>:<tag> localhost:5000/<image_name>:<tag>
# 推送Image
docker push localhost:5000/<image_name>:<tag>
# 例子
docker tag piyeh-redis:latest localhost:5000/piyeh_redis:v1
docker push localhost:5000/piyeh_redis:v1
為什麼要先 tag 再上傳至 registry:
Docker 使用 tag 來識別鏡像的來源和目的地。當您推送一個鏡像到 registry 時,Docker 需要知道這個鏡像應該被推送到哪裡。標記過程實際上是在告訴 Docker 兩件事:
a) 這個鏡像應該被推送到哪個 registry
b) 在該 registry 中,這個鏡像應該使用什麼名字和標籤
標記並不會創建新的鏡像,它只是為現有的鏡像創建一個新的引用。
為什麼要使用 localhost:5000:
localhost:5000 這個前綴有特殊的含義:
localhost 表示這個 registry 運行在本地機器上
:5000 是 Docker registry 的默認端口
當您使用 docker push 命令時,Docker 會查看鏡像名稱的第一部分(在斜線之前的部分)來決定推送的目標 registry。如果沒有指定 registry 地址,Docker 默認會嘗試推送到 Docker Hub。
通過添加 localhost:5000,您告訴 Docker:
不要推送到 Docker Hub
而是推送到運行在本地機器 5000 端口上的 registry
# PowerShell
Invoke-RestMethod -Uri "http://localhost:5000/v2/_catalog"
# 拉取Image
docker pull localhost:5000/<image_name>:<tag>
# 例子
docker pull localhost:5000/piyeh_redis:v1
今天學會自架一個Private Registry,加入Volume就能達到資料持久化存儲,大家可以嘗試看看! 如果大一點規模的團隊可能就會需要參考Harbor等等較完整功能的Docker Registry工具。